package org.summerframework.component.security.permissions.service;

import org.summerframework.component.mybatisplus.BasePlusQueryService;
import org.summerframework.component.security.permissions.service.dto.UserPermissionsDTO;
import org.summerframework.component.security.permissions.service.dto.UserPermissionsRoleRelDTO;
import org.summerframework.component.security.permissions.service.dto.UserPermissionsRoleRelQueryDTO;
import org.summerframework.core.exception.SelectNullException;
import org.springframework.boot.context.properties.PropertyMapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public interface UserPermissionsRoleRelService extends BasePlusQueryService<UserPermissionsRoleRelDTO, UserPermissionsRoleRelQueryDTO> {
    /**
     * 修复当角色选择了父节点时, 角色默认添加该权限
     *
     * @param parentId 父节点权限id
     * @param objectId 子节点权限id
     * @return 更新行数
     */
    Integer insertRepairParentId(Long parentId, Long objectId);

    /**
     * 更新角色权限列表
     *
     * @param permissionsIds 权限列表
     * @param roleId         权限id
     * @return 更新行数
     */
    Integer updatePermissionsIdsByUserId(List<Long> permissionsIds, Long roleId);

    /**
     * 根据roleId查询所有权限
     *
     * @param roleId 权限id
     * @return 列表
     */
    List<UserPermissionsRoleRelDTO> selectByRoleId(Long roleId);

    /**
     * 根据权限更新所有改权限的列表
     *
     * @param userPermissionsDTO 权限对象
     * @return 更新行数
     */
    Integer updateById(UserPermissionsDTO userPermissionsDTO);

    /**
     * 根据权限id删除
     *
     * @param objectId
     * @return
     */
    Integer deleteByObjectId(Long objectId);

    /**
     * 修复父节点数据
     *
     * @param parentId
     * @param groupParentId
     */
    void repairData(Long parentId, Map<Long, List<UserPermissionsRoleRelDTO>> groupParentId);

    default void repairData(Map<Long, List<UserPermissionsRoleRelDTO>> groupParentId) {
        new ArrayList<>(groupParentId.keySet()).forEach(parentId -> {
            repairData(parentId, groupParentId);
        });
    }

    default UserPermissionsRoleRelDTO cover(UserPermissionsDTO userPermissionsDTO) {
        return cover(userPermissionsDTO, new UserPermissionsRoleRelDTO());
    }

    default UserPermissionsRoleRelDTO cover(UserPermissionsDTO userPermissionsDTO, UserPermissionsRoleRelDTO userPermissionsRoleRelDTO) {
        if (userPermissionsDTO == null) {
            throw new SelectNullException(this.getClass());
        }

        PropertyMapper propertyMapper = PropertyMapper.get().alwaysApplyingWhenNonNull();

        propertyMapper.from(userPermissionsDTO::getCode).to(userPermissionsRoleRelDTO::setPermissionsCode);
        propertyMapper.from(userPermissionsDTO::getId).to(userPermissionsRoleRelDTO::setPermissionsId);
        propertyMapper.from(userPermissionsDTO::getName).to(userPermissionsRoleRelDTO::setPermissionsName);
        propertyMapper.from(userPermissionsDTO::getUrl).to(userPermissionsRoleRelDTO::setUrl);
        propertyMapper.from(userPermissionsDTO::getType).to(userPermissionsRoleRelDTO::setType);
        propertyMapper.from(userPermissionsDTO::getParentId).to(userPermissionsRoleRelDTO::setParentId);
        propertyMapper.from(userPermissionsDTO::getStatus).to(userPermissionsRoleRelDTO::setStatus);
        propertyMapper.from(userPermissionsDTO::getSortIndex).to(userPermissionsRoleRelDTO::setSortIndex);
        propertyMapper.from(userPermissionsDTO::getIsSystem).to(userPermissionsRoleRelDTO::setIsSystem);
        propertyMapper.from(userPermissionsDTO::getIcon).to(userPermissionsRoleRelDTO::setIcon);

        return userPermissionsRoleRelDTO;
    }

    /**
     * 根据角色id删除
     * @param id 角色id
     * @return
     */
    Integer deleteByRoleId(Long id);

    /**
     * 根据角色id跟新
     * @param dto
     */
    Integer updateByRoleId(UserPermissionsRoleRelDTO dto);
}
